import { lazyReportBatch } from "../report";

/**
 * 监听页面静态资源加载性能数据的主函数
 *
 * 功能说明：
 * 1. 在页面完成加载后立即执行性能监控
 * 2. 若页面尚未加载完成，则通过监听load事件延迟执行
 * 3. 最终会调用observerEvent启动性能数据采集
 */
export default function observerEntries() {
  if (document.readyState === "complete") {
    observerEvent();
  } else {
    const onLoad = () => {
      observerEvent();
      window.removeEventListener("load", onLoad, true);
    };
    window.addEventListener("load", onLoad, true);
  }
}

/**
 * 初始化性能观察者并收集资源加载数据
 *
 * 功能说明：
 * 1. 创建PerformanceObserver实例监听"resource"类型的性能条目
 * 2. 处理性能数据并格式化成标准上报结构
 * 3. 每次收到新数据后断开旧观察者（可能有潜在问题，需注意）
 */
export function observerEvent() {
  /**
   * 性能条目处理函数
   * @param {PerformanceObserverEntryList} list - 性能条目集合
   */
  const entryHandler = (list) => {
    const data = list.getEntries();
    for (const entry of data) {
      if (observerr) {
        observerr.disconnect();
      }

      // 构造包含22个关键指标的性能报告对象
      const reportData = {
        name: entry.name, // 资源完整URL
        type: "performance", // 监控类型标识
        subType: entry.entryType, // 条目类型（resource）
        sourceType: entry.initiatorType, // 资源类型（img/script/css等）
        duration: entry.duration, // 资源加载总耗时
        dns: entry.domainLookupEnd - entry.domainLookupStart, // DNS查询耗时
        tcp: entry.connectEnd - entry.connectStart, // TCP连接耗时
        redirect: entry.redirectEnd - entry.redirectStart, // 重定向耗时
        ttfb: entry.responseStart, // Time to First Byte（首字节时间）
        protocol: entry.nextHopProtocol, // 使用协议（h2/http/1.1等）
        responseBodySize: entry.encodedBodySize, // 压缩后响应体大小
        responseHeaderSize: entry.transferSize - entry.encodedBodySize, // 响应头大小
        transferSize: entry.transferSize, // 网络传输总大小（含头信息）
        resourceSize: entry.decodedBodySize, // 解压后资源实际大小
        startTime: performance.now(), // 数据采集时间戳
      };
      lazyReportBatch(reportData);
    }
  };

  // 创建性能观察者实例，监听所有资源类型条目
  let observerr = new PerformanceObserver(entryHandler);
  observerr.observe({ type: ["resource"], buffered: true });
}
